﻿Imports Microsoft.DirectX
Imports Microsoft.DirectX.Direct3D
Imports Commander_Wars.Spieletools
''' <summary>
''' Eine Landkarte zur Auswahl bei Kampagnen Spielen
''' (Nicht für ähnlich wie bei Schlacht um Mittelerde II)
''' </summary>
''' <remarks></remarks>
Public Class ObjektKartenauswahlLandkartenMenü
    Inherits ObjektFormMenü

    Public LandkartenInfo As ObjektLandkartenInfos = Nothing

    Dim Landkarte As Bitmap
    Dim LandkartenTextur As Texture
    Dim Landkartenteile As Bitmap() = {}
    Dim WasserTextur As Texture
    Dim WasserTexturBreite As Integer
    Dim LandkartenteileTexturen As Texture() = {}
    Dim LandkartenteileTexturenAusgewählt As Texture() = {}
    Dim TexturSieg, TexturVerloren As Texture
    Public AusgewählteMission As Integer = -1
    Dim AusgewählterMissionsName As String = ""
    Dim Karte As ObjektSpielfeld

    Public StartSpieler As Integer = 1

    Public Const Symbolbreite As Integer = 31

    Public KooX, KooY As Integer
    Dim ScrollX, ScrollY As Integer
    Dim Scrollen As Boolean = False

    Public Sub New(ByVal LandkarteniniPfad As String)
        MyBase.New()
        Dim Pfad As String = LandkarteniniPfad.Remove(LandkarteniniPfad.LastIndexOf("\")) + "\"
        LandkartenInfo = New ObjektLandkartenInfos(LandkarteniniPfad)
        LandkartenInfo.KampagnenOrdner = Pfad
        MissionsBilderLaden()
        If Landkarte Is Nothing Then
            KooX = Hauptmenü.MainMenü.MalPanel.Width / 2
            KooY = Hauptmenü.MainMenü.MalPanel.Height / 2
        Else
            KooX = Hauptmenü.MainMenü.MalPanel.Width / 2 - Landkarte.Width / 2
            KooY = Hauptmenü.MainMenü.MalPanel.Height / 2 - Landkarte.Height / 2
        End If
        

        ResetButton() 'So erstmal keine Buttons.
        NeuButton(30, Hauptmenü.MainMenü.MalPanel.Height - 30, My.Settings.Resourcenpfad + "Objekte\Button.png", "Beenden", New PointF(0, 1))
    End Sub
    Public Sub New(ByVal LandkartenInfo As ObjektLandkartenInfos)
        MyBase.New()
        Me.LandkartenInfo = LandkartenInfo
        MissionsBilderLaden()
        KooX = Hauptmenü.MainMenü.MalPanel.Width / 2 - Landkarte.Width / 2
        KooY = Hauptmenü.MainMenü.MalPanel.Height / 2 - Landkarte.Height / 2

        ResetButton() 'So erstmal keine Buttons.
        NeuButton(30, Hauptmenü.MainMenü.MalPanel.Height - 30, My.Settings.Resourcenpfad + "Objekte\Button.png", "Beenden", New PointF(0, 1))
    End Sub

    Private Sub MissionsBilderLaden()
        TexturSieg = Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "Landkarten\SymbolSieg.png")
        TexturVerloren = Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "Landkarten\SymbolNiederlage.png")
        If My.Computer.FileSystem.FileExists(My.Settings.Resourcenpfad + "Landkarten\" + LandkartenInfo.HintergrundsBild + ".png") Then
            Landkarte = Image.FromFile(My.Settings.Resourcenpfad + "Landkarten\" + LandkartenInfo.HintergrundsBild + ".png")
        End If
        LandkartenTextur = Grafikengine.LoadTexture(Landkarte)
        Array.Resize(Landkartenteile, LandkartenInfo.Missionen.Length)
        Array.Resize(LandkartenteileTexturen, LandkartenInfo.Missionen.Length)
        Array.Resize(LandkartenteileTexturenAusgewählt, LandkartenInfo.Missionen.Length)

        Dim bmp As Bitmap = Image.FromFile(My.Settings.Resourcenpfad + "Landkarten\HintergrundWasser.png")
        WasserTextur = Grafikengine.LoadTexture(bmp)
        WasserTexturBreite = bmp.Width

        For I = 0 To LandkartenInfo.Missionen.Length - 1
            Landkartenteile(I) = Image.FromFile(My.Settings.Resourcenpfad + "Landkarten\Komprimiert\" + LandkartenInfo.Missionen(I).getBildname + ".png")
            LandkartenteileTexturen(I) = Grafikengine.LoadTexture(Landkartenteile(I))
            LandkartenteileTexturenAusgewählt(I) = Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "Landkarten\Komprimiert\" + LandkartenInfo.Missionen(I).getBildname(True) + ".png")
        Next

    End Sub

    Public Overrides Sub Frame()

    End Sub

    Public Overrides Sub IniMenü()

    End Sub

    Public Overrides Sub KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs)
        Select Case e.KeyCode
            Case Keys.Escape
                Hauptmenü.Ini(Hauptmenü.Formmodi.Hauptmenü)
            Case Keys.Enter
                If Landkarte Is Nothing Then
                    KooX = Hauptmenü.MainMenü.MalPanel.Width / 2
                    KooY = Hauptmenü.MainMenü.MalPanel.Height / 2
                Else
                    KooX = Hauptmenü.MainMenü.MalPanel.Width / 2 - Landkarte.Width / 2
                    KooY = Hauptmenü.MainMenü.MalPanel.Height / 2 - Landkarte.Height / 2
                End If
        End Select
    End Sub

    Public Overrides Sub Malen()
        Dim sngrotation As Single = 0
        Dim intcolor As Color = Color.FromArgb(255, 255, 255, 255)
        Grafikengine.szfScale = Nothing
        Grafikengine.ptfRotCenter = New Point
        Grafikengine.recBild = Nothing

        For X = 0 To Hauptmenü.MainMenü.MalPanel.Width - 1 Step WasserTexturBreite
            For Y = 0 To Hauptmenü.MainMenü.MalPanel.Height - 1 Step WasserTexturBreite
                Grafikengine.ptfPosition = New Point(X, Y)
                Grafikengine.Sprite.Draw2D(WasserTextur, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngrotation, Grafikengine.ptfPosition, intcolor)
            Next
        Next
        Grafikengine.ptfPosition = New Point(KooX, KooY)
        If LandkartenTextur IsNot Nothing Then
            Grafikengine.Sprite.Draw2D(LandkartenTextur, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngrotation, Grafikengine.ptfPosition, intcolor)
        End If
        For I = 0 To LandkartenteileTexturen.Length - 1
            'Die Landkarte malen.
            intcolor = LandkartenInfo.Missionen(I).getIntColor
            Grafikengine.ptfPosition.X = KooX + LandkartenInfo.Missionen(I).getBildKooX
            Grafikengine.ptfPosition.Y = KooY + LandkartenInfo.Missionen(I).getBildKooY

            Grafikengine.Sprite.Draw2D(LandkartenteileTexturen(I), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngrotation, Grafikengine.ptfPosition, intcolor)
            If I = AusgewählteMission Then 'und evtl. noch einen Fokus setzen.
                intcolor = LandkartenInfo.Missionen(I).getIntColor(True)
                If LandkartenteileTexturenAusgewählt(I) IsNot Nothing Then
                    Grafikengine.Sprite.Draw2D(LandkartenteileTexturenAusgewählt(I), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngrotation, Grafikengine.ptfPosition, intcolor)
                End If
            End If
            Select Case LandkartenInfo.Missionen(I).MissionsZustand
                Case Mission.MissionsZustände.Gewonnen
                    Grafikengine.ptfPosition.X = KooX + LandkartenInfo.Missionen(I).getBildKooX(True) - Symbolbreite / 2
                    Grafikengine.ptfPosition.Y = KooY + LandkartenInfo.Missionen(I).getBildKooY(True) - Symbolbreite / 2
                    intcolor = Color.FromArgb(255, 255, 255, 255) 'Die Symbole werden ganz normal gemalt.
                    Grafikengine.Sprite.Draw2D(TexturSieg, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngrotation, Grafikengine.ptfPosition, intcolor)
                Case Mission.MissionsZustände.Verloren
                    Grafikengine.ptfPosition.X = KooX + LandkartenInfo.Missionen(I).getBildKooX(True) - Symbolbreite / 2
                    Grafikengine.ptfPosition.Y = KooY + LandkartenInfo.Missionen(I).getBildKooY(True) - Symbolbreite / 2
                    intcolor = Color.FromArgb(255, 255, 255, 255) 'Die Symbole werden ganz normal gemalt.
                    Grafikengine.Sprite.Draw2D(TexturVerloren, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngrotation, Grafikengine.ptfPosition, intcolor)
            End Select
        Next
        If AusgewählteMission >= 0 Then
            Dim Name As String = AusgewählterMissionsName
            Dim X As Integer = Hauptmenü.MainMenü.MalPanel.Width / 2 - Name.Length * ObjektAlphabet.BuchstabenBreite
            ObjektAlphabet.DrawString(Name, 1, New Point(X, 20), 2)
        End If
        ObjekteMalen()
        If Not ObjektKODialog.AktuellerDialog Is Nothing Then
            If ObjektKODialog.AktuellerDialog.Malen = True Then
                ObjektKODialog.AktuellerDialog.Löschen()
            End If
        End If
    End Sub

    Public Overrides Sub MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
        If ObjektKODialog.EingabenAngenommen Then Exit Sub
        Select Case e.Button
            Case MouseButtons.Left
                checkMouseDownObjekte(e.X, e.Y)
            Case MouseButtons.Middle
                ScrollX = e.Location.X
                ScrollY = e.Location.Y
                Scrollen = True
        End Select
    End Sub

    Public Overrides Sub MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
        MouseMoveObjekte(e.X, e.Y)
        If Scrollen Then
            'na dann, einfach den Bildschirm verschieben.
            KooX += e.X - ScrollX
            KooY += e.Y - ScrollY
            ScrollX = e.X
            ScrollY = e.Y
        End If
    End Sub

    Public Overrides Sub MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
        If ObjektKODialog.EingabenAngenommen Then Exit Sub
        If ObjektKODialog.AktuellerDialog Is Nothing Then
            Select Case e.Button
                Case MouseButtons.Left
                    'Erstmal Knöpfe und so abfragen...
                    Dim Funktion As String = checkMouseUPObjekte(e.X, e.Y)
                    Select Case Funktion.ToLower
                        Case "beenden"
                            Hauptmenü.Ini(Hauptmenü.Formmodi.Hauptmenü)
                        Case "mission beginnen!"
                            'Starten Juhuu!!
                            KarteStartbereit()
                        Case ""
                            'So man hat nichts ausgewählt.
                            'vielleicht hat man sich ja auf eine Karte geeinigt.
                            KarteAuswählen(e.X, e.Y)
                    End Select
                Case MouseButtons.Middle
                    Scrollen = False
            End Select
        End If
    End Sub

    Public Overrides Sub MouseWheel(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)

    End Sub

    Public Overrides Sub SetMausBild()

    End Sub

    Public Overrides Sub SprachEingabe(ByVal Eingabe As String)

    End Sub


    Sub KarteAuswählen(ByVal KooX As Integer, ByVal KooY As Integer)
        If ObjektKODialog.AktuellerDialog Is Nothing Then
            'Wichtig!
            'Ich gehe davon aus, dass das Bild nicht gestreckt ist, mit anderen Worten, ich vergleiche Die Entsprechenden Pixel
            KooX -= Me.KooX 'Die Position des Bildschirms wird errechnet.
            KooY -= Me.KooY
            Dim LetzteMission As Integer = AusgewählteMission
            AusgewählteMission = -1 'Wenn wir nichts finden, haben wir auch nichts ausgewählt.
            For I = Landkartenteile.Length - 1 To 0 Step -1
                Dim KoordinateX As Integer = KooX - LandkartenInfo.Missionen(I).getBildKooX
                Dim KoordinateY As Integer = KooY - LandkartenInfo.Missionen(I).getBildKooY
                If KoordinateX < 0 Then Continue For
                If KoordinateY < 0 Then Continue For
                If KoordinateX >= Landkartenteile(I).Width Then Continue For
                If KoordinateY >= Landkartenteile(I).Height Then Continue For
                'OK, wir scheinen im Rahmen zu sein.... jetzt kanns richtig losgehen :)
                If Landkartenteile(I).GetPixel(KoordinateX, KoordinateY).A > 1 Then
                    If LandkartenInfo.Missionen(I).isAuswählbar Then
                        'Wir malen das Bild, wenn auch vielleicht ein bischen schwach.
                        AusgewählteMission = I 'Gefunden!!!
                        Exit For
                    End If
                End If
            Next

            ResetButton() 'So erstmal keine Buttons.
            NeuButton(30, Hauptmenü.MainMenü.MalPanel.Height - 30, My.Settings.Resourcenpfad + "Objekte\Button.png", "Beenden", New PointF(0, 1))
            If AusgewählteMission = -1 Then
                'Nichts ausgewählt

            Else
                'Etwas Ausgewählt
                NeuButton(Hauptmenü.MainMenü.MalPanel.Width - 130, Hauptmenü.MainMenü.MalPanel.Height - 30, My.Settings.Resourcenpfad + "Objekte\Button.png", "Mission beginnen!", New PointF(1, 1))
                If LetzteMission <> AusgewählteMission Then
                    KartenAuswahlEreignisse()
                End If
            End If
        End If
    End Sub

    Sub KartenAuswahlEreignisse()
        If AusgewählteMission < 0 Then
            AusgewählterMissionsName = ""
        Else
            AusgewählterMissionsName = LandkartenInfo.Missionen(AusgewählteMission).Missionsname
            If My.Computer.FileSystem.FileExists(LandkartenInfo.KampagnenOrdner + LandkartenInfo.Missionen(AusgewählteMission).Missionsname + ".ini") Then
                DialogTextSprachKonverter.Reset()
                Dim strR As New IO.StreamReader(LandkartenInfo.KampagnenOrdner + LandkartenInfo.Missionen(AusgewählteMission).Missionsname + ".ini", System.Text.Encoding.Default)
                While Not strR.EndOfStream
                    Dim z As String = strR.ReadLine
                    z = z.Trim
                    If z = "" Then Continue While 'Leerzeilen ignorieren
                    If z.StartsWith("'") Then Continue While

                    If z.ToLower.StartsWith("dialog:") Then
                        z = z.Remove(0, 7)
                        Dim s() As String = z.Split("|")
                        Dim Chat As String = ""
                        For i = 3 To s.Length - 2
                            Chat += s(i) + "|"
                        Next
                        Chat += s(s.Length - 1)
                        Dim Ausdruck As ObjektKOTextZeile.KOGesichtsAusdruck = CInt(s(2))
                        ObjektKODialog.NeuerDialog(New ObjektKODialog.KOText() {New ObjektKODialog.KOText(s(0), Chat, CInt(s(1) - 1), Ausdruck)})
                        Continue While
                    End If
                    If z.ToLower.StartsWith("Dialog2:".ToLower) Then
                        z = z.Remove(0, 8)
                        Dim s() As String = z.Split("|")
                        Dim Chat As String = ""
                        For i = 5 To s.Length - 2
                            Chat += s(i) + "|"
                        Next
                        Chat += s(s.Length - 1)
                        Dim Ausdruck As ObjektKOTextZeile.KOGesichtsAusdruck = CInt(s(2))
                        ObjektKODialog.NeuerDialog(New ObjektKODialog.KOText() {New ObjektKODialog.KOText(s(0), Chat, CInt(s(1) - 1), Ausdruck, , s(3), s(4))})
                        Continue While
                    End If
                    If z.Trim.StartsWith("%") Then
                        'hm.. eine Sprach...
                        Dim s() As String = z.Split("%")
                        DialogTextSprachKonverter.SprachKonvIni.AddEintrag(s(1), s(3), s(2))
                    End If
                    If z.ToLower.StartsWith("name:") Then
                        AusgewählterMissionsName = z.Remove(0, 5)
                    End If
                End While
                strR.Dispose()
            End If
        End If
    End Sub

    ''' <summary>
    ''' Fängt den Start der ausgewählten Karte an. Sie wird geladen und entweder gleich (per Ini gestartet) oder man muss noch einstellungen treffen.
    ''' </summary>
    ''' <remarks></remarks>
    Sub KarteStartbereit()
        If AusgewählteMission = -1 Then Exit Sub 'Sowas brauchen wir hier gar nicht!

        'Ladebildschirm
        Hauptmenü.Pause = True
        ObjektLadebildschirm.Ladebildschirm = New ObjektLadebildschirm(2, "", LandkartenInfo.KampagnenOrdner + LandkartenInfo.Missionen(AusgewählteMission).Missionsname, True, ".map", True, False)


        KarteStarten()
    End Sub
    ''' <summary>
    ''' Startet das Spiel, jetzt ist es für Änderungen zu spät, außer Inline Patching :)
    ''' </summary>
    ''' <remarks></remarks>
    Sub KarteStarten()
        'Wir blockieren bestimmte Truppen
        For I = 1 To Objektverwalter.Spielfeld.Spieler.Length - 1
            For I2 = 0 To LandkartenInfo.BlockierteEinheiten.Length - 1
                If Objektverwalter.Spielfeld.Spieler(I).Armee = LandkartenInfo.BlockierteEinheiten(I2).Armee Then
                    'Jetzt kann man die nicht mehr bauen.
                    If Objektverwalter.Spielfeld.Spieler(I).Bauliste Is Nothing Then
                        Objektverwalter.Spielfeld.Spieler(I).Bauliste = New Bauliste(ObjektLadeklasse.GetBauliste(Baulisten.CoW))
                    End If
                    Objektverwalter.Spielfeld.Spieler(I).Bauliste.AddWert(LandkartenInfo.BlockierteEinheiten(I2).EinheitenID, 0)
                End If
            Next
        Next

        '  Objektverwalter.Spielfeld.Regeln = NeueRegeln
        Hauptmenü.Ini(Hauptmenü.Formmodi.Spiel, , True)
    End Sub
    Public Overrides Sub ChangeWindowSize(ByVal PosChange As System.Drawing.Point)
        MyBase.ChangeWindowSizeObjekte(PosChange)
        KooX += PosChange.X * 0.5#
        KooY += PosChange.Y * 0.5#
    End Sub
End Class
